# coding: UTF-8
import os

import pandas as pd
import numpy as np

rand_grade = {
    "优": 95,
    "良": 85,
    "中": 75,
    "及格": 60,
    "不及格": 0
}

EXAMINATION_WEIGHT = 0.65
CHECK_WEIGHT = 0.35

# SHEET_NAME = "Sheet1"

def compute_grade(file_name):
    print(file_name)

    # xl = pd.ExcelFile("./data/test.xlsx")
    xl = pd.ExcelFile(file_name)

    sheet_names = xl.sheet_names

    df = xl.parse(sheet_names[0])
    # df = xl.parse(SHEET_NAME)

    xl_values = df.values
    print(xl_values)

    # 记录最终成绩


    grade_data = []
    cur_grade_data = []
    # 遍历每一行的数据
    for line_array in xl_values:
        if isinstance(line_array[0], str):
            # 以研究生在校学习成绩表开始，为一个学生
            if (line_array[0].strip().startswith('研究生在校学习成绩表')):
                # 当前学生信息
                cur_grade_data = []
                # 考试成绩
                examinations = []
                examination_credits = []
                # 考核成绩
                checks = []
                check_credits = []

            # '学号', '姓名', '性别', '学科门类', '学科专业', '指导老师'
            if (line_array[0].strip().startswith('学号')):
                cur_grade_data.append(line_array[1])
                cur_grade_data.append(line_array[3])
                cur_grade_data.append(line_array[5])
                cur_grade_data.append(line_array[7])

            if (line_array[0].strip().startswith('学科专业')):
                cur_grade_data.append(line_array[2])
                cur_grade_data.append(line_array[-1])

            # '学科成绩' 按照公式计算，先记录，再计算
            # 如果最后为日期说明是成绩
            if isinstance(line_array[-1], str):
                if (len(line_array[-1].split('-')) == 3):
                    # 考试
                    if (line_array[-3] == '/'):
                        examination_credits.append(line_array[-2])
                        examinations.append(float(line_array[-4]))
                    # 考查
                    else:
                        check_credits.append(line_array[-2])
                        checks.append(rand_grade[line_array[-3]])
                        # if(line_array[-3] == '优'):
                        #     checks.append(float(95))
                        # elif(line_array[-3] == '良'):
                        #     checks.append(float(85))
                        # elif(line_array[-3] == '中'):
                        #     checks.append(float(75))
                        # elif (line_array[-3] == '及格'):
                        #     checks.append(float(60))
                        # else:
                        #     checks.append(float(0))
            # 以制表人结束
            if (line_array[0].strip().startswith('制表人')):
                # 保存一个人的成绩
                # pprint('计算{}的成绩'.format())
                cur_grade = (np.sum(np.array(examinations) * np.array(examination_credits)) * EXAMINATION_WEIGHT +
                             np.sum(np.array(checks) * np.array(check_credits)) * CHECK_WEIGHT) / \
                            (np.sum(np.array(examination_credits) * EXAMINATION_WEIGHT) + np.sum(
                                np.array(check_credits) * CHECK_WEIGHT))
                # 保留两位小数点
                cur_grade = round(cur_grade, 2)
                cur_grade_data.append(cur_grade)
                grade_data.append(cur_grade_data)

    grade_df = pd.DataFrame(data=grade_data, columns=['学号', '姓名', '性别', '学科门类', '学科专业', '指导老师', '学科成绩'])
    src_path = os.path.split(file_name)

    # 不需要保存索引

    # grade_df.to_excel('./data/grade_test.xlsx')
    save_path = os.path.join(src_path[0], '学科成绩_' + src_path[-1])

    grade_df.to_excel(save_path, index=False)
    return len(grade_data), save_path


if __name__ == '__main__':
    file_name = './data/test.xlsx'
    compute_grade(file_name)
